home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************************
- *
- * MODULE NAME: CPICPORT.C
- *
- * COPYRIGHTS:
- * This module contains code made available by IBM
- * Corporation on an AS IS basis. Any one receiving the
- * module is considered to be licensed under IBM copyrights
- * to use the IBM-provided source code in any way he or she
- * deems fit, including copying it, compiling it, modifying
- * it, and redistributing it, with or without
- * modifications. No license under any IBM patents or
- * patent applications is to be implied from this copyright
- * license.
- *
- * A user of the module should understand that IBM cannot
- * provide technical support for the module and will not be
- * responsible for any consequences of use of the program.
- *
- * Any notices, including this one, are not to be removed
- * from the module without the prior written consent of
- * IBM.
- *
- * AUTHOR: Peter J. Schwaller
- * VNET: PJS at RALVM6 Tie Line: 444-4376
- * Internet: pjs@ralvm6.vnet.ibm.com (919) 254-4376
- *
- * FUNCTION: Contains procedures to that may have to be rewritten for
- * different environments.
- *
- * AVAILABILITY:
- * These sample programs and source are also available on
- * CompuServe through the APPC Information Exchange. To get
- * to the APPC forum just type 'GO APPC' from any CompuServe
- * prompt. The samples are available in the Sample Programs
- * library section. Just search on the keyword CPICPGMS to
- * find all the samples in this series.
- *
- * Updates for the sample programs and support for many more
- * CPI-C platforms will also be made available on CompuServe.
- *
- * RELATED FILES:
- * CPICPORT.H
- *
- *****************************************************************************/
-
-
- /* if on OS/2, get the OS/2 include file
- * needed for:
- * DosAllocSeg
- * DosGetMachineMode
- */
- #if defined(OS2) || defined(FAPI) || defined(OS2_20)
- #define INCL_BASE
- #include <os2.h>
- #endif
- #include "cpicport.h"
-
-
- /* standard C include files */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- /*
- * Some platforms do not have the strupr C library routine, so we will
- * define it here. strupr converts a string to uppercase.
- */
-
- #if defined(OS400) || defined(VM) || defined(MVS) || defined(AIX)
- int
- strupr (char * string)
- {
- for (;*string;++string)
- *string=toupper(*string);
- return;
- }
- #endif
-
- /*
- * OS/2 can optimize performance if a special shared memory buffer is
- * used as the data buffer on calls to CMSEND and CMRCV. To hide this
- * special case from the calling program, this procedure should be
- * called to allocate all CPI-C data buffers.
- */
-
- char far *
- alloc_cpic_buffer (USHORT size)
- {
- #if defined(OS2) || defined(FAPI)
- #ifndef OS2_20
- USHORT selector; /* selector from DosAllocSeg */
- USHORT dos_rc; /* OS/2 return code */
- char far *memory_pointer; /* return pointer to memory */
-
- dos_rc = DosAllocSeg ((unsigned)size, /* size of memory to allocate */
- (PSEL)&selector, /* returned: selector address */
- (unsigned)1); /* shared, unmamed segment */
- if (dos_rc == 0) { /* Non-zero OS/2 return code? */
- SELECTOROF(memory_pointer) = selector; /* address = Selector:0 */
- OFFSETOF(memory_pointer) = 0; /* set the offset to 0 */
- return(memory_pointer);
- } else {
- return malloc(size);
- }
- #else
- PVOID address;
- ULONG dos_rc;
-
- dos_rc = DosAllocSharedMem(&address,
- NULL,
- size,
- fALLOCSHR);
-
- if (dos_rc == 0) { /* Non-zero OS/2 return code? */
- return(address);
- } else {
- return malloc(size);
- }
- #endif
- #else
- return malloc(size);
- #endif
- }
-
-
- void
- show_info(char * * text)
- /*
- * This procedure displays a block of text information on the the screen.
- * The input argument is an array of strings to be output, one string
- * per line. A NULL array element indicates the end of the strings.
- */
- {
- int i;
-
- for ( i = 0; text[i] != NULL; i++ ) {
- printf("%s\n", text[i]);
- }
- return;
- }
-
- USHORT
- get_machine_mode(void)
- /*
- * In OS/2 and DOS, this procedure indicates whether the machine is
- * currently running in real (DOS) or protect (OS/2) mode.
- * 1 - Protect (OS/2)
- * 0 - Real (DOS)
- */
- {
- #if defined(OS2) || defined(FAPI)
- #ifndef OS2_20
- unsigned char mode;
- USHORT dos_rc;
- USHORT rc;
- dos_rc = DosGetMachineMode(&mode);
- if (!dos_rc) {
- rc = (USHORT)mode;
- } else {
- rc = 0;
- }
- return rc;
- #else
- return 1;
- #endif
- #else
- return 0;
- #endif
- }
-
- int
- get_passwd(char * passwd, int max_length)
- /*
- * Gets a password from the user. Where possible, this routine should
- * disable echoing of keystrokes for security reasons.
- *
- * Returns
- * 0 - password was successfully input
- * 1 - password variable was not updated successfully
- */
- {
- int rc;
- #if defined(OS2) || defined(FAPI)
- STRINGINBUF stringinbuf;
-
- set_echo(FALSE); /* keystrokes will not appear */
-
- stringinbuf.cb = max_length; /* set the max input size */
-
- /* this call will not allow the user to enter more than the specified */
- /* maximum number of characters. */
- KbdStringIn((unsigned char *)passwd, &stringinbuf, 0, 0);
-
- passwd[stringinbuf.cchIn] = '\0'; /* ensure NULL termination */
-
- set_echo(TRUE); /* turn echo of keystrokes on */
- rc = 0;
-
- #else
- int length;
-
- /* There is no portable way to disable echoing of input keystrokes. */
- /* If a platform does support turning off echo, this section should be */
- /* rewritten and ifdef'ed. */
-
- length = (int) fgets(passwd, max_length+1, stdin);
- if (length > 0 && length < max_length) {
- if (passwd[length-1] == '\n') { /* remove the trailing */
- passwd[length-1] = '\0'; /* newline if it exists */
- }
- rc = 0;
- } else {
- rc = 1;
- }
-
- #endif
- return rc;
- }
-
- void
- set_echo(int mode)
- {
- #if defined(OS2) || defined(FAPI)
- KBDINFO kbdinfo; /* keyboard status info */
-
- kbdinfo.cb = 10;
- KbdGetStatus(&kbdinfo, 0);
-
- if (mode) {
- /* Keystrokes will be displayed on the screen */
- kbdinfo.fsMask |= 1; /* set echo on */
- kbdinfo.fsMask &= 0xFD; /* turn on echo */
- } else {
- /* Keystrokes will not be displayed on the screen */
- kbdinfo.fsMask |= 2; /* set echo off */
- kbdinfo.fsMask &= 0xFE; /* turn off echo */
- }
-
- KbdSetStatus(&kbdinfo, 0);
- #else
-
- #endif
-
- return;
- }
-
-
- void ascii_to_ebcdic_field (char * ascii_field,
- USHORT field_size)
- {
- USHORT i;
-
- for (i = 0;
- i < field_size;
- ascii_field[i] = ascii_to_ebcdic_table[(unsigned)ascii_field[i]],i++);
- }
-
- void ascii_to_ebcdic_string (char * ascii_string)
- {
- ascii_to_ebcdic_field(ascii_string, strlen(ascii_string));
- }
-
- void ebcdic_to_ascii_field (char * ebcdic_field,
- USHORT field_size)
- {
- USHORT i;
-
- for (i = 0;
- i < field_size;
- ebcdic_field[i] =
- ebcdic_to_ascii_table[(unsigned)ebcdic_field[i]],i++);
- }
-
- void ebcdic_to_ascii_string (char * ebcdic_string)
- {
- ebcdic_to_ascii_field(ebcdic_string, strlen(ebcdic_string));
- }
-
-
-
- /* ASCII to EBCDIC translate table (only UGL character set) */
-
- char ascii_to_ebcdic_table[] = {
- #if 0
- /* PJS */
- "\x00\x01\x02\x03\x37\x2D\x2E\x2F\x16\x05\x25\x0B\x0C\x0D\x0E\x0F" /* 00-0F */
- #endif
- "\x00\x01\x02\x03\x37\x2D\x2E\x2F\x16\x05\x15\x0B\x0C\x0D\x0E\x0F" /* 00-0F */
- "\x10\x11\x12\x13\x3C\x3D\x32\x26\x18\x19\x3F\x27\x22\x1D\x35\x1F" /* 10-1F */
- "\x40\x5A\x7F\x7B\x5B\x6C\x50\x7D\x4D\x5D\x5C\x4E\x6B\x60\x4B\x61" /* 20-2F */
- "\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\x7A\x5E\x4C\x7E\x6E\x6F" /* 30-3F */
- "\x7C\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xD1\xD2\xD3\xD4\xD5\xD6" /* 40-4F */
- "\xD7\xD8\xD9\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xAD\xE0\xBD\x5F\x6D" /* 50-5F */
- "\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96" /* 60-6F */
- "\x97\x98\x99\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xC0\x4F\xD0\xA1\x07" /* 70-7F */
- "\x43\x20\x21\x1C\x23\xEB\x24\x9B\x71\x28\x38\x49\x90\xBA\xEC\xDF" /* 80-8F */
- "\x45\x29\x2A\x9D\x72\x2B\x8A\x9A\x67\x56\x64\x4A\x53\x68\x59\x46" /* 90-9F */
- "\xEA\xDA\x2C\xDE\x8B\x55\x41\xFE\x58\x51\x52\x48\x69\xDB\x8E\x8D" /* A0-AF */
- "\x73\x74\x75\xFA\x15\xB0\xB1\xB3\xB4\xB5\x6A\xB7\xB8\xB9\xCC\xBC" /* B0-BF */
- "\xAB\x3E\x3B\x0A\xBF\x8F\x3A\x14\xA0\x17\xCB\xCA\x1A\x1B\x9C\x04" /* C0-CF */
- "\x34\xEF\x1E\x06\x08\x09\x77\x70\xBE\xBB\xAC\x54\x63\x65\x66\x62" /* D0-DF */
- "\x30\x42\x47\x57\xEE\x33\xB6\xE1\xCD\xED\x36\x44\xCE\xCF\x31\xAA" /* E0-EF */
- "\xFC\x9E\xAE\x8C\xDD\xDC\x39\xFB\x80\xAF\xFD\x78\x76\xB2\x9F\xFF" /* F0-FF */
- };
-
- /* EBCDIC to ASCII translate table (only UGL character set) */
-
- char ebcdic_to_ascii_table[] = {
- "\x00\x01\x02\x03\xCF\x09\xD3\x7F\xD4\xD5\xC3\x0B\x0C\x0D\x0E\x0F" /* 00-0F */
- #if 0
- PJS fix for strange value for \n on VM
- "\x10\x11\x12\x13\xC7\xB4\x08\xC9\x18\x19\xCC\xCD\x83\x1D\xD2\x1F" /* 10-1F */
- #endif
- "\x10\x11\x12\x13\xC7\x0A\x08\xC9\x18\x19\xCC\xCD\x83\x1D\xD2\x1F" /* 10-1F */
- "\x81\x82\x1C\x84\x86\x0A\x17\x1B\x89\x91\x92\x95\xA2\x05\x06\x07" /* 20-2F */
- "\xE0\xEE\x16\xE5\xD0\x1E\xEA\x04\x8A\xF6\xC6\xC2\x14\x15\xC1\x1A" /* 30-3F */
- "\x20\xA6\xE1\x80\xEB\x90\x9F\xE2\xAB\x8B\x9B\x2E\x3C\x28\x2B\x7C" /* 40-4F */
- "\x26\xA9\xAA\x9C\xDB\xA5\x99\xE3\xA8\x9E\x21\x24\x2A\x29\x3B\x5E" /* 50-5F */
- "\x2D\x2F\xDF\xDC\x9A\xDD\xDE\x98\x9D\xAC\xBA\x2C\x25\x5F\x3E\x3F" /* 60-6F */
- "\xD7\x88\x94\xB0\xB1\xB2\xFC\xD6\xFB\x60\x3A\x23\x40\x27\x3D\x22" /* 70-7F */
- "\xF8\x61\x62\x63\x64\x65\x66\x67\x68\x69\x96\xA4\xF3\xAF\xAE\xC5" /* 80-8F */
- "\x8C\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x97\x87\xCE\x93\xF1\xFE" /* 90-9F */
- "\xC8\x7E\x73\x74\x75\x76\x77\x78\x79\x7A\xEF\xC0\xDA\x5B\xF2\xF9" /* A0-AF */
- "\xB5\xB6\xFD\xB7\xB8\xB9\xE6\xBB\xBC\xBD\x8D\xD9\xBF\x5D\xD8\xC4" /* B0-BF */
- "\x7B\x41\x42\x43\x44\x45\x46\x47\x48\x49\xCB\xCA\xBE\xE8\xEC\xED" /* C0-CF */
- "\x7D\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\xA1\xAD\xF5\xF4\xA3\x8F" /* D0-DF */
- "\x5C\xE7\x53\x54\x55\x56\x57\x58\x59\x5A\xA0\x85\x8E\xE9\xE4\xD1" /* E0-EF */
- "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\xB3\xF7\xF0\xFA\xA7\xFF" /* F0-FF */
- };